Либо создаем зомби через Bash:

(sleep 1 & exec /bin/sleep 7200) &

Выполняем команды и наблюдаем zombie процесс:

ps aux | grep Z

Вывод на экран:

root 1669051 Z 14:09 0:00 [zombie] <defunct>

Ага, хорошо, зомби завели. Теперь как это дело всё закилить. Простой kill -9 PID не поможет, так как PID родительского процесса будет отличаться от дочернего.

Чтобы найти PID родителя, смотрим:

ps ax | grep zombie

Кто-то грепает по слову defunct, тут уже по потребностям выбирай.

Видим все PIDы и родителя и дочернего:

1669050 S+ 0:00 ./zombie
1669051 Z+ 0:00 [zombie] <defunct>

В моем случае PID родительского = 1669050, а дочернего 1669051, который собственно и есть зомбик.

Теперь накидываем однострочник:

kill -9 $(ps -A -o stat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

Эта штука найдет все зомби процессы и уничтожит их. Даже не нужно никакие циклы на Bash колхозить.

А если требуется регулярно зачищать зомборей, вешаем однострочник на cron и радуемся.

Вообще это самый простой способ закилить эту каку. Как это сделать через gdb напишу на следующей неделе. Но сразу предупреждают, там оверхед решение и скорее всего оно тебе не понравится. Хотя через gdb можно оставить в живых родительский процесс и убить только дочерних зомбаков.

В большинстве случаев не стоит обращать внимание на этих зомбаков, эти процессы не жрут ресурсы, а являются лишь косяками программного обеспечения. 

У меня зомбаки порой случались с nginx на древней CentOS, но после апгрейда на убунту, все прошло.

Если сможешь что-то еще добавить, пиши в комменты, будет всем полезно.

Давай, хороших выходных, не болей!


